#include <iostream>

using namespace std;


// //虽然能识别左右值，但是并不能对不同类型的参数调用不同操作，假如想要int类型的参数打印int，想要double类型的参数打印double，这是无法实现的
// template<class T>
// void func(T &n){
//     cout << "左值=" << n << endl;
// }

// template<class T>
// void func(T &&m){
//     cout << "右值=" << m << endl;
// }

void func(int &n){
    cout << "左值int=" << n << endl;
}

void func(int &&m){
    cout << "右值int=" << m << endl;
}

void func(double &n){
    cout << "左值double=" << n << endl;
}

void func(double &&m){
    cout << "右值double=" << m << endl;
}


template<class T>
void revoke(T &&t){
    func(forward<T>(t));
}



int main(){

    int i = 10;
    int &n = i;
    int &&m = 100;
    m = 10;

    //只能识别左右值，不能根据参数类型选择不同操作
    // func(n);
    // func(static_cast<int&&>(m));


    //正确推导
    revoke(static_cast<int&>(n));
    revoke(static_cast<int&&>(m));

    double d = 1.1;
    double &dn = d;
    double &&dm = 10.10;
    revoke(static_cast<double&>(dn));
    revoke(static_cast<double&&>(dm));

    // //err -- 全部是左值
    // revoke(n);
    // revoke(m);

    // //err -- 全部是右值
    // revoke(static_cast<int>(n));
    // revoke(static_cast<int>(m));
    return 0;
}
